# -*- coding: utf-8 -*-

#    Copyright (C) 2014 by Promotux
#                       di Francesco Meloni snc - http://www.promotux.it/

#    Author: Francesco Meloni  <francesco@promotux.it>

#    This file is part of OdCollect.

#    OdCollect is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 2 of the License, or
#    (at your option) any later version.

#    OdCollect is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.

#    You should have received a copy of the GNU General Public License
#    along with OdCollect.  If not, see <http://www.gnu.org/licenses/>.

import base64
import Environment
import datetime
from sqlalchemy import func
from web_lib.page import Page
from web_lib.webutils import Response, expose ,leggiInSessione , json
from PIL import Image, ImageFile
#import ExifTags

@expose('/italiaCives/segnalazioni')
@expose('/italiaCives/segnalazioni/')
@expose('/italiaCives/segnalazioni/<page>')
def segnalazioni_ic(req, subdomain=None, page=None):
    """ gestisce la lista delle segnalazioni, qualche paginazione
    elementare e poco più
    """
    if not leggiInSessione(sezione="Main", chiave="schema"):
        url_red = "/italiaCives"
        return Page(req).redirect(url_red)
    elif leggiInSessione(sezione="Main", chiave="id_oper") or leggiInSessione(sezione="Main", chiave="username"):
        from dao.Segnalazione import Segnalazione
        numero = Segnalazione().count(batchSize=None)
        batchSize = 3
        #if not page:
            #page = 1
        if page:
            offset = batchSize*int(page)
            page = int(page)+1
        else:
            offset=0
            page=1
        if (offset+batchSize)>=numero:
            page=0
        segn = Segnalazione().select(offset=offset,batchSize=batchSize)
        pageData = {'file' : "ic/segnalazioni",
                    "segnalazioni": segn,
                    "page":page
                        }
        return Page(req).render(pageData)
    else:
        pageData = {'file': "ic/modulo_registrazione",
                    "dao":None,
                    "fullpage":True
                    }
        return Page(req).render(pageData)

@expose('/italiaCives/segnalazione/Preview')
def preview_segnalazione_ic(req, action=None):
    """ Qui gestiamo l'anteprima o dettaglio della segnalazione
    """
    if not leggiInSessione(sezione="Main", chiave="schema"):
        url_red = "/italiaCives"
        return Page(req).redirect(url_red)
    from dao.TipoSegnalazione import TipoSegnalazione
    from dao.PrioritaSegnalazione import PrioritaSegnalazione
    from dao.Segnalazione import Segnalazione
    from dao.StatoSegnalazione import StatoSegnalazione
    from dao.PercorsoSegnalazione import PercorsoSegnalazione
    id = req.args.get("id")
    if id and id != "None":
        d = Segnalazione().getRecord(id=int(id))
        percorso = PercorsoSegnalazione().select(id_segnalazione=d.id, batchSize=None)
    else:
        d = Segnalazione()
        percorso = []
    pageData = {'file': "ic/preview_segnalazione",
                "percorso":percorso,
                "dao": d,
                }
    return Page(req).render(pageData)


@expose('/italiaCives/segnalazione/add')
def edit_segnalazione_ic(req, action=None):
    """ Qui gestiamo la modifica, riceve un id e rimanda il dao con
    i dati accessori per le eventuali combo
    """

    if not leggiInSessione(sezione="Main", chiave="schema"):
        url_red = "/italiaCives"
        return Page(req).redirect(url_red)
    elif leggiInSessione(sezione="Main", chiave="id_oper"):
        id_oper = leggiInSessione(sezione="Main", chiave="id_oper")
        from dao.Operatore import Operatore
        opi = Operatore().getRecord(id=id_oper)
        if opi.active:
            from dao.TipoSegnalazione import TipoSegnalazione
            from dao.PrioritaSegnalazione import PrioritaSegnalazione
            from dao.Segnalazione import Segnalazione
            from dao.StatoSegnalazione import StatoSegnalazione
            from dao.PercorsoSegnalazione import PercorsoSegnalazione
            id = req.form.get("id")
            if id and id != "None":
                d = Segnalazione().getRecord(id=int(id))
                percorso = PercorsoSegnalazione().select(id_segnalazione=d.id, batchSize=None)
            else:
                d = None #Segnalazione()
                percorso = []
            pageData = {'file': "ic/edit_segnalazione",
                        "dao": d,
                        "percorso": percorso,
                        "tiposegnalazione": TipoSegnalazione().select(batchSize=None),
                        "prioritasegnalazione": PrioritaSegnalazione().select(batchSize=None),
                        "statosegnalazione": StatoSegnalazione().select(batchSize=None),
                        }
            return Page(req).render(pageData)
        else:
            pageData = {'file': "ic/modulo_registrazione",
                    "dao":None,
                    "waiting":True
                    }
            return Page(req).render(pageData)

    else:
        pageData = {'file': "ic/modulo_registrazione",
                    "dao":None,
                    "waiting":False
                    }
        return Page(req).render(pageData)


@expose('/italiaCives/segnalazione/addpic')
def add_pic_segnalazione_ic(req, action=None):
    """Aggiunge una riga alle segnalazioni"""
    import imghdr
    item="Nessuna foto"
    if leggiInSessione(sezione="Main", chiave="id_oper"):
        id_oper = leggiInSessione(sezione="Main", chiave="id_oper")
        from dao.Operatore import Operatore
        opi = Operatore().getRecord(id=id_oper)
        if opi.active:
            from dao.Segnalazione import Segnalazione
            from dao.PercorsoSegnalazione import PercorsoSegnalazione
            id = req.form.get("id_segna")
            if id and id != "None":
                d = Segnalazione().getRecord(id=int(id))
            if "image_file" in req.files:# and req.files["image_files"].filename != "" :
                f = req.files.get('image_file')
                name = f.filename
                print " FILE_NAME", name
                data = f.read()
                #name =f.filename
                print " NAMEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE", name
                if name and name != "":
                    fileObj = open(name ,"wb")
                    fileObj.write(data)
                    fileObj.close()
                    formato = imghdr.what(name)
                    #if formato == "jpeg":
                    img_file = Image.open(name)
                    print " MA ESISTI", img_file, formato
                    orgInfo=img_file.info
                    if img_file.size[0] > 2000:
                        scale_img_low = 2000*100/img_file.size[0]
                    else:
                        scale_img_low = 100
                    img_quality = 75
                    if scale_img_low == 100:
                        width, height = img_file.size
                    else:
                        width, height = (int(scale_img_low * img_file.size[0] / 100.0),
                                        int(scale_img_low * img_file.size[1] / 100.0))

                    img_file_low = img_file.resize((width, height), Image.ANTIALIAS)
                    try:
                        info_exif = orgInfo['exif']
                    except:
                        info_exif = []
                    img_file_low.save(name+"_low."+formato,
                                      optimize=True,
                                      quality=img_quality,
                                      progressive=True,
                                      #exif=info_exif
                                      )
                    with open(name+"_low."+formato, "rb") as imageFile_low:
                        d.immagine_low = base64.b64encode(imageFile_low.read())
                    scale_img_thumb = 400*100/img_file.size[0]
                    width, height = (int(scale_img_thumb * img_file.size[0] / 100.0),
                                        int(scale_img_thumb * img_file.size[1] / 100.0))
                    img_file_thumb = img_file.resize((width, height), Image.ANTIALIAS)
                    img_file_thumb.save(name+"_thumb."+formato,
                                      optimize=True,
                                      quality=img_quality,
                                      progressive=True,
                                      #exif=info_exif
                                      )
                    with open(name+"_thumb."+formato, "rb") as imageFile_thumb:
                        d.immagine_thumb = base64.b64encode(imageFile_thumb.read())
                    if data:
                        #d.immagine = base64.b64encode(data)
                        d.immagine = d.immagine_thumb

                    d.persist()
                    item = "Foto salvata"

    jasoned = json.dumps(item, ensure_ascii=False, encoding='utf8')
    return Response(jasoned)
    #url_red = "/italiaCives/dashboard#segnalazioni"
    #return Page(req).redirect(url_red)

@expose('/italiaCives/segnalazione/Create')
def create_segnalazione_ic(req, action=None):
    """Aggiunge una riga alle segnalazioni"""
    import imghdr
    if leggiInSessione(sezione="Main", chiave="id_oper"):
        id_oper = leggiInSessione(sezione="Main", chiave="id_oper")
        from dao.Operatore import Operatore
        opi = Operatore().getRecord(id=id_oper)
        if opi.active:
            from dao.Segnalazione import Segnalazione
            from dao.PercorsoSegnalazione import PercorsoSegnalazione
            id = req.form.get("id")
            if id and id != "None":
                d = Segnalazione().getRecord(id=int(id))
                if not d.id_operatore:
                    d.id_operatore = id_oper
            else:
                d = Segnalazione()
                d.id_operatore = id_oper
            if not d.numero:
                a= Environment.session.query(func.max(Segnalazione.numero)).all()
                if a:
                    try:
                        d.numero = a[0][0] +1
                    except:
                        d.numero = 1
            d.denominazione = str(req.form.get("denominazione"))
            d.descrizione = str(req.form.get("formSubmission"))

            try:
                id_tipo_segnalazione = int(req.form.get("id_tipo_segnalazione"))
            except:
                id_tipo_segnalazione = None
            d.id_tipo_segnalazione = id_tipo_segnalazione
            try:
                id_priorita_segnalazione = int(req.form.get("id_priorita_segnalazione"))
            except:
                id_priorita_segnalazione = None
            d.id_priorita_segnalazione = id_priorita_segnalazione
            try:
                id_stato_segnalazione = int(req.form.get("id_stato_segnalazione"))
            except:
                id_stato_segnalazione = 1
            d.id_stato_segnalazione = id_stato_segnalazione
            if not d.data_inserimento:
                d.data_inserimento = datetime.datetime.now()
            d.lat = str(req.form.get("maplat"))
            d.lng = str(req.form.get("maplng"))
            d.persist()

            c = PercorsoSegnalazione().select(id_segnalazione=d.id,
                                            id_stato_segnalazione=id_stato_segnalazione,
                                            id_priorita_segnalazione=id_priorita_segnalazione,
                                            id_tipo_segnalazione=id_tipo_segnalazione,
                                            id_operatore = id_oper,
                                            batchSize=None)
            if not c:
                c = PercorsoSegnalazione()
                c.id_segnalazione = d.id
                c.id_priorita_segnalazione = id_priorita_segnalazione
                c.id_tipo_segnalazione = id_tipo_segnalazione
                c.id_stato_segnalazione = id_stato_segnalazione
                c.id_operatore = id_oper
                c.data_modifica = datetime.datetime.now()
            if type(c) == list and len(c) >=1:
                c = c[-1]
            c.note = str(req.form.get("note") or "")
            c.persist()
            item = {"result":"OK",
                    "id":d.id,
                    }
        jasoned = json.dumps(item, ensure_ascii=False, encoding='utf8')
        return Response(jasoned)


@expose('/italiaCives/segnalazione/delete')
def delete_segnalazione_ic_(req, action=None):
    if leggiInSessione(sezione="Main", chiave="schema") and leggiInSessione(sezione="Main", chiave="id_oper"):
        id_oper = leggiInSessione(sezione="Main", chiave="id_oper")
        from dao.Operatore import Operatore
        opi = Operatore().getRecord(id=id_oper)
        if opi and opi.active and opi.tipo_operatore =="amministratore":
            from dao.Segnalazione import Segnalazione
            from dao.PercorsoSegnalazione import PercorsoSegnalazione
            id = req.args.get("id")
            if id and id != "None":
                ps = PercorsoSegnalazione().select(id_segnalazione=id, batchSize=None)
                for p in ps:
                    p.delete()
                d = Segnalazione().getRecord(id=int(id))
                if d:
                    d.delete()
    url_red = "/italiaCives/dashboard#segnalazione"
    return Page(req).redirect(url_red)
